Tutorial – Binding one element property to another
The properties of WPF elements can be bound to properties of other WPF Elements. Lets do some simple examples of binding one element to another.
For this tutorial, I assume you are in Visual Studio 2008. I assume that you already know how to create a new Project and choose WPF Application. All examples assume you have a new WPF Application.
I am the believer that one example isn’t enough, so I am going to give you three examples:
Example 1 – Binding and Element’s property to CheckBox.IsChecked
This example will demonstrate binding a Button
‘s IsEnabled
property to a CheckBox
‘s IsChecked
property.
Step 1 – Add the elements
- Add two items from the Toolbox:
CheckBox
Button
The
Button
is namedbutton1
and theCheckBox
is namedcheckBox1.
- Change the text of the
checkBox1
to “Enable button”. This can be done either in the Properties or in the XAML.
Step 2 – Adding Binding to the Button
- In the XAML, locate the
button1
element. - Add the following to the
button1
element:IsEnabled="{Binding ElementName=checkBox1, Path=IsChecked}"
In your project,ElementName
could be any item. In this example, we only have two elements so far:button1
, andcheckBox1
.The XAML now looks like this (only two new lines exist):<Window x:Class="BindingATextBoxToASlider.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"> <Grid> <Button Content="Button" Height="23" Margin="12,34,416,0" Name="button1" VerticalAlignment="Top" Width="75" IsEnabled="{Binding ElementName=checkBox1, Path=IsChecked}"/> <CheckBox Content="CheckBox" Height="16" Margin="12,12,408,0" Name="checkBox1" VerticalAlignment="Top" /> </Grid> </Window>
- Compile and run your program.
- Check and uncheck the box an watch the binding do its work as it enables and disables the button.
Ok, so that was pretty cool. We have a simple example of binding one Element to another.
You can shoot yourself in the foot or Don’t be stupid!
Yes, you can shoot yourself in the foot by doing something stupid.
You could bind an element to itself. Let’s try it just so you can see it happen.
Add the same binding you added to button1
to checkBox1
.
Compile and see what happens.
Example 2 – Binding and Element’s property to Slider.Value
This example uses a Slider
and a TextBox
.
Step 1 – Add the elements
- Add two items from the Toolbox:
TextBox
Slider
The
Slider
is namedslider1
and theTextBox
is namedtextBox1.
Step 2 – Adding Binding to the TextBox
- In the XAML, locate the
textBox1
element. - Add the following to the
textBox1
element:Text="{Binding ElementName=slider1, Path=Value}"
ElementName
can be any item. In this example, we only have two elements so far:slider1
, andtextBox1
.The XAML now looks like this (only two new lines exist):<Window x:Class="BindingATextBoxToASlider.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"> <Grid> <TextBox Height="23" Margin="79,62,99,0" Name="textBox1" VerticalAlignment="Top" Text="{Binding ElementName=slider1, Path=Value}"/> <Slider Height="22" Margin="79,34,99,0" Name="slider1" VerticalAlignment="Top" /> </Grid> </Window>
- Compile and run your program.
- Slide the slider and watch the binding do its work as its value is displayed in the textBox1 as it changes.
Calculations in XAML Bindings are Unsupported
Ok, so maybe you want to try to do calculations in the XAML Binding. It doesn’t work.
You can enter this and while it will compile, the Binding won’t work:
Text="{Binding ElementName=slider1, Path=(int)Value}"
You can enter this and while it will compile, the Binding won’t work:
Text="{Binding ElementName=slider1, Path=Value + 1}"
Example 3 – Binding and Element’s property to CheckBox.IsChecked
Ok, lets do a slight more complex example. We are going to have more than two elements. We are going to have a ListBox
that contains a list of items (ListBoxItems
). We are going to have a TextBox
that displays the content of the selected item.
Step 1 – Add the elements
- Add two items from the Toolbox:
TextBox
ListBox
- Add multiple items to
listBox1
. This can be done either in the XAML or by clicking on the button forItems
in the Properties of thelistBox1
.
Step 2 – Adding Binding to the TextBox
- In the XAML, locate the
textBox1
element. - Add the following to the
textBox1
element:Text="{Binding ElementName=listBox1, Path=SelectedItem.Content}"
Notice that we are using a property of a property for the Path. This is allowed.SelectedItem
is a property oflistBox1
, andContent
is a property ofSelectedItem
.The XAML now looks like this (only two new lines exist):<Window x:Class="BindingATextBoxToAListBoxSelectedItem.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="300" Width="300"> <Grid> <TextBox Height="23" Margin="12,23,12,0" Name="textBox1" VerticalAlignment="Top" Text="{Binding ElementName=listBox1, Path=SelectedItem.Content}"/> <ListBox Margin="12,52,12,110" Name="listBox1"> <ListBoxItem>c:</ListBoxItem> <ListBoxItem>d:</ListBoxItem> <ListBoxItem>e:</ListBoxItem> <ListBoxItem>f:</ListBoxItem> <ListBoxItem>g:</ListBoxItem> <ListBoxItem>h:</ListBoxItem> </ListBox> </Grid> </Window>
- Compile and run your program.
- Select different items in the list and watch the textBox1 change to display the content of the selected item.
Copyright ® Rhyous.com – Linking to this post is allowed without permission and as many as ten lines of this page can be used along with this link. Any other use of this page is allowed only by permission of Rhyous.com.
Névtelen 7:35 deMondjuk hivatkozhatnék az 1000 fÅ‘s békefenntartó amntÃciószibre, meg a Dél-Kelet Ãzsiában, a Kaukázusban, illetve a Közel-Keleten "fokozódó nemzetközi helyzetre", és akkor az Arab Tavasz és Afrika szokásos problémáiról nem is beszéltem, de az ilyen anonim, hivatásos fanyalgókat a tények nem nagyon szokták zavarni.Simán csak Bálint
Well nice.
But what to do if 2 elements to bind (Checkbox + Progressbar as example) are in 2 different columns ?
...
...
So the first progressbar appears and disappears if the checkbox is checked or not, the second one does nothing.
Best regards
Daniel
Columns really have nothing to do with it.
Do you have this:
[ ] Check Box 1 | [******----] progressBar1
[ ] Check Box 2 | [*****-----] progressBar2
If so, progressBar1 binds to check box 1 and progress bar 2 binds to check box 2. The should work identically.
Thanks a lot! Good one,it is very helpful to me. clear understanding of data binding concept.
Thanks, Very Good Tutorial.
Helped me to understand the concept of binding.
Thanks a lot! Very simple and very helpful.